package com.tyut.musicdreamer.framework.starter.storage.service;

import com.tyut.musicdreamer.framework.starter.storage.model.StorageClass;
import com.tyut.musicdreamer.framework.starter.storage.model.UploadResult;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;

/**
 * 存储服务接口
 */
public interface StorageService {
    /**
     * 存储文件
     *
     * @param file 文件
     * @param directory 存储目录
     * @return 存储结果
     */
    UploadResult store(MultipartFile file, String directory) throws IOException;
    
    /**
     * 存储文件
     *
     * @param file 文件
     * @param directory 存储目录
     * @param storageClass 存储类别
     * @return 存储结果
     */
    UploadResult store(MultipartFile file, String directory, StorageClass storageClass) throws IOException;
    
    /**
     * 存储文件
     *
     * @param inputStream 输入流
     * @param fileName 文件名
     * @param contentType 内容类型
     * @param fileSize 文件大小
     * @param directory 存储目录
     * @return 存储结果
     */
    UploadResult store(InputStream inputStream, String fileName, String contentType, long fileSize, String directory) throws IOException;
    
    /**
     * 存储文件
     *
     * @param inputStream 输入流
     * @param fileName 文件名
     * @param contentType 内容类型
     * @param fileSize 文件大小
     * @param directory 存储目录
     * @param storageClass 存储类别
     * @return 存储结果
     */
    UploadResult store(InputStream inputStream, String fileName, String contentType, long fileSize, String directory, StorageClass storageClass) throws IOException;
    
    /**
     * 生成预签名下载URL
     *
     * @param objectKey 对象键
     * @param expirationMinutes 过期时间(分钟)
     * @return 预签名URL
     */
    String generatePresignedUrl(String objectKey, int expirationMinutes);
    
    /**
     * 生成预签名上传URL
     *
     * @param fileName 文件名
     * @param contentType 内容类型
     * @param directory 存储目录
     * @param expirationMinutes 过期时间(分钟)
     * @return 预签名上传URL和对象键
     */
    UploadResult generatePresignedUploadUrl(String fileName, String contentType, String directory, int expirationMinutes);
    
    /**
     * 生成预签名上传URL
     *
     * @param fileName 文件名
     * @param contentType 内容类型
     * @param directory 存储目录
     * @param storageClass 存储类别
     * @param expirationMinutes 过期时间(分钟)
     * @return 预签名上传URL和对象键
     */
    UploadResult generatePresignedUploadUrl(String fileName, String contentType, String directory, StorageClass storageClass, int expirationMinutes);
    
    /**
     * 删除文件
     *
     * @param objectKey 对象键
     * @return 是否删除成功
     */
    boolean delete(String objectKey);
    
    /**
     * 获取文件输入流
     *
     * @param objectKey 对象键
     * @return 文件输入流
     */
    InputStream getFileInputStream(String objectKey) throws IOException;
    
    /**
     * 获取文件访问URL
     *
     * @param objectKey 对象键
     * @return 访问URL
     */
    String getFileUrl(String objectKey);
    
    /**
     * 获取文件CDN访问URL
     *
     * @param objectKey 对象键
     * @return CDN访问URL，如果未配置CDN则返回普通URL
     */
    String getCdnUrl(String objectKey);
    
    /**
     * 更新文件的存储类别
     *
     * @param objectKey 对象键
     * @param storageClass 存储类别
     * @return 是否更新成功
     */
    boolean updateStorageClass(String objectKey, StorageClass storageClass);
    
    /**
     * 生成RTMP推流URL
     *
     * @param channelName 通道名称
     * @param expirationMinutes 过期时间(分钟)
     * @return RTMP推流URL
     */
    default String generateRtmpUrl(String channelName, int expirationMinutes) {
        throw new UnsupportedOperationException("当前存储服务不支持RTMP推流");
    }
    
    /**
     * 创建RTMP直播通道
     *
     * @param channelName 通道名称
     * @param description 通道描述
     * @return 推流URL和播放URL
     */
    default String[] createLiveChannel(String channelName, String description) {
        throw new UnsupportedOperationException("当前存储服务不支持RTMP直播");
    }
} 